/**
 * Recherche effectuée sur un site précis
 * 
 * Contient toute les informations liées à la recherche en cours (nombre de pages, page courante, ...)
 * 
 * De base, la recherche est inactive, il faut la lancer via la méthode start
 * 
 * 
 * @param {Array} args Les arguments de la recherche
 * @param {Website} website Le Website lié
 */
function WebsiteSearch(args, website)
{
	var _args;
	var _website;
	var _type;
	
	var _currentPage;
	
	this.onpageload = null;
	
	var _this = this;
	
	/**
	 * Constructeur de la classe
	 * 
	 * @param {Array} args Les arguments de la recherche
	 * @param {Website} website Le Website lié
	 */
	function _construct(args, website)
	{
		_args = args;
		_website = website;
	}
	
	/**
	 * Démarre la recherche
	 */
	this.start = function()
	{
		// Récupération de l'URL de la première page
		var url = _website.getFirstPageUrl(_args);
		// On stocke le type de formulaire
		_type = url.type;
		// Création et lancement de la requête
		var request = new Request(url.url, url.type, url.params);
		request.onload = _onload_firstpage;
		request.start();
	};
	
	/**
	 * Ecouteur déclenché au chargement de la première page
	 * 
	 * @param {RequestEvent} e l'event associé
	 */
	function _onload_firstpage(e)
	{
		var doc = e.getRequest().getResponseDocument();
		WebsiteSearch.lastRequest = e.getRequest();
		var page = _website.parseDomAndGetPage(doc);
		page.setPageIndex(1);
		_currentPage = page;
		
		if (typeof(_this.onpageload) == "function")
			_this.onpageload(page);

		
	}

    /**
     * Continue la recherche avec la prochaine page, si disponible
     */
	function _continueSearch()
	{
		return _detectNextPage(_currentPage);
	}

    /**
     * Détecte s'il y a une prochaine page, et fait la requête, si disponible
     *
     * @param {WebsitePage} page la page à détecter
     * @return {boolean} true s'il y a une prochaine page, false sinon
     */
	function _detectNextPage(page)
	{
		if (page.haveNextPage())
		{
			var pageurl = page.getNextPage();
			var request = new Request(pageurl.url.url, _type, pageurl.url.params);
			request.onload = _onload_page;
			request.pageIndex = page.getPageIndex()+1;
			request.start();
			
			return true;
		}
		
		return false;
	}

    /**
     * Ecouteur déclenché lorsqu'une page est chargé, autre que la première
     *
     * Appelle onpageload
     *
     * @param {event} e l'event
     */
	function _onload_page(e)
	{
		var doc = e.getRequest().getResponseDocument();
		WebsiteSearch.lastRequest = e.getRequest();
		var page = _website.parseDomAndGetPage(doc)
		
		page.setPageIndex(e.getRequest().pageIndex);
		
		if (typeof(_this.onpageload) == "function")
			_this.onpageload(page);
		
		_currentPage = page;
	}
	
	_construct(args,website)
}
